home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_87 / filters.pas < prev    next >
Pascal/Delphi Source File  |  1995-01-01  |  6KB  |  223 lines

  1. {****************************************************************************}
  2. {                                                                            }
  3. { MODULE:         Filters                                                    }
  4. {                                                                            }
  5. { DESCRIPTION:    Implements several kinds of fast digital filters.          }
  6. {                 They all are 1st order FIR filters (in case you know what  }
  7. {                 I mean ;-).                                                }
  8. {                                                                            }
  9. { AUTHOR:         Juan Carlos Arévalo                                        }
  10. {                                                                            }
  11. { MODIFICATIONS:  Nobody (yet ;-)                                            }
  12. {                                                                            }
  13. { HISTORY:        21-Oct-1992 Documentation                                  }
  14. {                                                                            }
  15. { (C) 1992 VangeliSTeam                                                      }
  16. {____________________________________________________________________________}
  17.  
  18. UNIT Filters;
  19.  
  20. {$G+}
  21.  
  22. INTERFACE
  23.  
  24. TYPE
  25.   { NOTE: A cut-off frequency of PI*X means that the cut-off frequency is
  26.           at f*X/2 where f is the sampling rate. For example, with a
  27.           sampling rate of 20000 Hz, a PI*3/4 means a cut-off frequency of
  28.           7500 Hz.                                                         }
  29.  
  30.   TFilterMethod = (fmNone, { No filtering.                           }
  31.                    fm7_8,  { Filter with a PI*7/8 cut-off frequency. }
  32.                    fm3_4,  { Filter with a PI*3/4 cut-off frequency. }
  33.                    fm1_2   { Filter with a PI*1/2 cut-off frequency. }
  34.   );
  35.  
  36. CONST
  37.   FilterMod = ORD(fm1_2) + 1;
  38.  
  39.  
  40.  
  41.  
  42. FUNCTION FilterChunkWord(VAR Buf; Len, Offs: WORD; Method: TFilterMethod; OldSpl: WORD) : WORD; { Word-sized filter. }
  43. FUNCTION FilterChunkByte(VAR Buf; Len, Offs: WORD; Method: TFilterMethod; OldSpl: WORD) : WORD; { Byte-sized filter. }
  44.  
  45.  
  46.  
  47.  
  48. IMPLEMENTATION
  49.  
  50. VAR
  51.   LastSamplesByte : INTEGER;
  52.  
  53.  
  54.  
  55.  
  56. {----------------------------------------------------------------------------}
  57. { Word size filters.                                                         }
  58. {____________________________________________________________________________}
  59.  
  60. PROCEDURE Filter1_2Word; ASSEMBLER;
  61.   ASM
  62. @@lp:    MOV    AX,[ES:DI]
  63.          ADD    BX,AX
  64.          XCHG   BX,AX
  65.          SAR    AX,1
  66.          MOV    [ES:DI],AX
  67.          ADD    DI,SI
  68.          LOOP   @@lp
  69.   END;
  70.  
  71. PROCEDURE Filter3_4Word; ASSEMBLER;
  72.   ASM
  73. @@lp:    MOV    AX,[ES:DI]
  74.          SAR    BX,1
  75.          ADD    BX,AX
  76.          XCHG   BX,AX
  77.  
  78.          SAR    AX,1
  79.          MOV    DX,AX
  80.          SAR    AX,2
  81.          ADC    DX,AX
  82.          SAR    AX,2
  83.          ADC    AX,DX
  84.  
  85.          MOV    [ES:DI],AX
  86.          ADD    DI,SI
  87.          LOOP   @@lp
  88.   END;
  89.  
  90. PROCEDURE Filter7_8Word; ASSEMBLER;
  91.   ASM
  92. @@lp:    MOV    AX,[ES:DI]
  93.          SAR    BX,2
  94.          ADD    BX,AX
  95.          XCHG   BX,AX
  96.  
  97.          SAR    AX,1
  98.          MOV    DX,AX
  99.          SAR    AX,1
  100.          ADC    DX,AX
  101.          SAR    AX,3
  102.          ADC    AX,DX
  103.  
  104.          MOV    [ES:DI],AX
  105.          ADD    DI,SI
  106.          LOOP   @@lp
  107.   END;
  108.  
  109.  
  110. FUNCTION FilterChunkWord(VAR Buf; Len, Offs: WORD; Method: TFilterMethod; OldSpl: WORD) : WORD; ASSEMBLER;
  111.   ASM
  112.         MOV     SI,[Offs]
  113.         ADD     SI,SI
  114.         LES     DI,[Buf]
  115.         MOV     BX,[OldSpl]
  116.         MOV     CX,[Len]
  117.         JCXZ    @@Fin
  118.         MOV     AL,[Method]
  119.         CMP     AL,fm1_2
  120.         JNZ     @@1
  121.          CALL   Filter1_2Word
  122.          JMP    @@Fin
  123. @@1:    CMP     AL,fm3_4
  124.         JNZ     @@2
  125.          CALL   Filter3_4Word
  126.          JMP    @@Fin
  127. @@2:    CMP     AL,fm7_8
  128.         JNZ     @@Fin
  129.          CALL   Filter7_8Word
  130. @@Fin:
  131.         MOV     AX,BX
  132.   END;
  133.  
  134.  
  135.  
  136.  
  137. {----------------------------------------------------------------------------}
  138. { Byte size filters.                                                         }
  139. {____________________________________________________________________________}
  140.  
  141. PROCEDURE Filter1_2Byte; ASSEMBLER;
  142.   ASM
  143. @@lp:    MOV    AH,[ES:DI]
  144.          XOR    AL,AL
  145.          SAR    AX,2
  146.          ADD    BX,AX
  147.          XCHG   BX,AX
  148.          SHL    AX,1
  149.          MOV    [ES:DI],AH
  150.          ADD    DI,SI
  151.          LOOP   @@lp
  152.   END;
  153.  
  154. PROCEDURE Filter3_4Byte; ASSEMBLER;
  155.   ASM
  156. @@lp:    MOV    AL,[ES:DI]
  157.          SAR    BL,1
  158.          ADD    BL,AL
  159.          XCHG   BL,AL
  160.  
  161.          SAR    AL,1
  162.          MOV    DL,AL
  163.          SAR    AL,2
  164.          ADC    DL,AL
  165.          SAR    AL,2
  166.          ADC    AL,DL
  167.  
  168.          MOV    [ES:DI],AL
  169.          ADD    DI,SI
  170.          LOOP   @@lp
  171.   END;
  172.  
  173. PROCEDURE Filter7_8Byte; ASSEMBLER;
  174.   ASM
  175. @@lp:    MOV    AH,[ES:DI]
  176.          XOR    AL,AL
  177.          SAR    AX,2
  178.          SAR    BX,2
  179.          ADD    BX,AX
  180.          XCHG   BX,AX
  181.  
  182.          SAR    AX,1
  183.          MOV    DX,AX
  184.          SAR    AX,1
  185.          ADC    DX,AX
  186.          SAR    AX,3
  187.          ADC    AX,DX
  188.  
  189.          SHL    AX,2
  190.          MOV    [ES:DI],AH
  191.          ADD    DI,SI
  192.          LOOP   @@lp
  193.   END;
  194.  
  195.  
  196. FUNCTION FilterChunkByte(VAR Buf; Len, Offs: WORD; Method: TFilterMethod; OldSpl: WORD) : WORD; ASSEMBLER;
  197.   ASM
  198.         MOV     SI,[Offs]
  199.         LES     DI,[Buf]
  200.         MOV     BX,[OldSpl]
  201.         MOV     CX,[Len]
  202.         JCXZ    @@Fin
  203.         MOV     AL,[Method]
  204.         CMP     AL,fm1_2
  205.         JNZ     @@1
  206.          CALL   Filter1_2Byte
  207.          JMP    @@Fin
  208. @@1:    CMP     AL,fm3_4
  209.         JNZ     @@2
  210.          CALL   Filter3_4Byte
  211.          JMP    @@Fin
  212. @@2:    CMP     AL,fm7_8
  213.         JNZ     @@Fin
  214.          CALL   Filter7_8Byte
  215. @@Fin:
  216.         MOV     AX,BX
  217.   END;
  218.  
  219.  
  220.  
  221.  
  222. END.
  223.